declare global {
  interface Window {
    __MICRO_APP_ENVIRONMENT__: boolean;
    __MICRO_APP_BASE_ROUTE__: string;
    __MICRO_APP_PUBLIC_PATH__: string;
    __MICRO_APP_NAME__: string;
    microApp: {
      getGlobalData: () => Record<string, any>;
      setGlobalData: (data: Record<string, any>) => void;
      getData: () => Record<string, any>;
      addDataListener: (fn: (data: Record<string, any>) => void | string | Record<string, any>, autoTrigger?: boolean) => void;

      addGlobalDataListener: (fn: (data: Record<string, any>) => void | string, autoTrigger?: boolean) => void;
      removeDataListener: (fn: (data: Record<string, any>) => void) => void;
      dispatch: (data: { name: string; data: any }) => void;
    };
  }
}

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

let app: any = null

// 判断是否是微前端环境
const isMicroApp = window.__MICRO_APP_ENVIRONMENT__
console.log('[Vue子应用] 环境检测:', isMicroApp ? '微前端环境' : '独立环境')

// 微前端环境下的生命周期
if (window.__MICRO_APP_ENVIRONMENT__) {
  // @ts-ignore 因为vite子应用关闭了沙箱，我们需要为子应用appname-vite创建EventCenterForMicroApp对象来实现数据通信
  console.log('[Vue子应用] 基础配置信息:')
  console.log('[Vue子应用] - BASE_ROUTE:', window.__MICRO_APP_BASE_ROUTE__)
  console.log('[Vue子应用] - PUBLIC_PATH:', window.__MICRO_APP_PUBLIC_PATH__)

  // 监听基座应用数据变化
  const handleMounted = () => {
    try {
      // 获取初始全局数据
      const globalData = window.microApp?.getGlobalData()
      console.log('[Vue子应用] 初始全局数据:', globalData)

      window.microApp.addGlobalDataListener((data: any) => {
        console.log('[Vue子应用]来自基座应用或子应用的数据', data)
      },true)
    } catch (error) {
      console.error('[Vue子应用] 初始化失败:', error)
    }
  }

  // 立即注册生命周期
  window['micro-app-child-app'] = {
    mount: () => {
      console.log('[Vue子应用] ====== 开始挂载 ======')
      try {
        // 确保卸载旧实例
        if (app) {
          console.log('[Vue子应用] 清理: 卸载旧实例')
          app.unmount()
          app = null
        }
  
        // 创建新实例
        console.log('[Vue子应用] 初始化: 创建新应用实例')
        app = createApp(App)
        app.use(router)
        app.use(ElementPlus)

        // 在应用挂载后执行数据初始化
        app.mixin({
          mounted() {
            // 判断是否为根组件
            if (this.$parent === null) {
              handleMounted()
            }
          }
        })
  
        // 检查挂载点
        const appContainer = document.querySelector('micro-app-body')
        if (!appContainer) {
          throw new Error('[Vue子应用] 错误: 找不到挂载点 micro-app-body')
        }
        console.log('[Vue子应用] 挂载点检查: 成功')
  
        // 重要：先清空容器
        appContainer.innerHTML = '<div id="app"></div>'
        
        // 重要：使用完整的选择器
        const mountEl = appContainer.querySelector('#app')
        if (!mountEl) {
          throw new Error('[Vue子应用] 错误: 找不到挂载元素 #app')
        }
        console.log('[Vue子应用] 挂载准备: 目标元素就绪')
        
        // 直接挂载到元素
        app.mount(mountEl)
        console.log('[Vue子应用] 挂载完成 ✅')
        console.log('[Vue子应用] ====== 挂载结束 ======')
      } catch (e) {
        console.error('[Vue子应用] 致命错误:', e)
      }
    },
    unmount: () => {
      console.log('[Vue子应用] 开始卸载')
      if (window.microApp) {
        // 清理数据监听
        console.log('[Vue子应用] 已移除全局数据监听')
      }
      if (app) {
        app.unmount()
        app = null
        console.log('[Vue子应用] 实例已卸载')
      }
    }
  }
} else {
  console.log('[Vue子应用] 以独立模式启动')
  app = createApp(App)
  app.use(router)
  app.use(ElementPlus)
  app.mount('#app')
}
